/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.opt.detaildossier.services.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.opt.detaildossier.builder.DTODateRangeDetailDossierBuilder;
import fr.generali.accueilclient.opt.detaildossier.builder.DTODossierDetailDossierBuilder;
import fr.generali.accueilclient.opt.detaildossier.builder.DTOFamilleProduitDetailDossierBuilder;
import fr.generali.accueilclient.opt.detaildossier.builder.DTOMonetaryQuantityBuilder;
import fr.generali.accueilclient.opt.detaildossier.builder.DTOMotifsDetailDossierBuilder;
import fr.generali.accueilclient.opt.detaildossier.om.ICriteresRecherchesDetailDossier;
import fr.generali.accueilclient.opt.detaildossier.om.IDateRangeDetailDossier;
import fr.generali.accueilclient.opt.detaildossier.om.IDossierDetailDossier;
import fr.generali.accueilclient.opt.detaildossier.om.IFamilleProduitDetailDossier;
import fr.generali.accueilclient.opt.detaildossier.om.IMonetaryQuantity;
import fr.generali.accueilclient.opt.detaildossier.om.IMotifsDetailDossier;
import fr.generali.relationclient.marketing.opt.detaildossier.DtoCriteresRecherches;
import fr.generali.relationclient.marketing.opt.detaildossier.DtoDossier;
import fr.generali.relationclient.marketing.opt.detaildossier.DtoFamilleProduit;
import fr.generali.relationclient.marketing.opt.detaildossier.DtoMotifs;
import fr.generali.relationclient.marketing.opt.detaildossier.builder.DtoCriteresRecherchesBuilder;
import fr.generali.relationclient.marketing.opt.detaildossier.datatype.DateRange;
import fr.generali.relationclient.marketing.opt.detaildossier.datatype.MonetaryQuantity;

/**
 * @author Holmes Kelly
 */

@Component("detailDossierMapper")
public class DetailDossierMapper {

    /**
     * @param criteresRecherches criteres recherche
     * @return DtoCriteresRecherches
     */
    public DtoCriteresRecherches mapperCriteresRecherches2DtoCriteresRecherches(
                    ICriteresRecherchesDetailDossier criteresRecherches) {

        DtoCriteresRecherches dtoCriteresRecherches = null;

        if (criteresRecherches != null) {

            dtoCriteresRecherches = DtoCriteresRecherchesBuilder.dtoCriteresRecherches()
                            .buildIdentifiantDossier(criteresRecherches.getIdentifiantDossier())
                            .build();
        }

        return dtoCriteresRecherches;
    }

    /**
     * @param dtoDossier dtoDossier
     * @return IDossier
     */
    public IDossierDetailDossier mapperDtoDossier2IDossier(DtoDossier dtoDossier) {

        IDossierDetailDossier dossierDetailDossier = null;

        if (dtoDossier != null) {

            dossierDetailDossier = DTODossierDetailDossierBuilder.dTODossierDetailDossier()
                            .buildCodeIssue(dtoDossier.getCodeIssue())
                            .buildCodeOrigine(dtoDossier.getCodeOrigine())
                            .buildCodePostal(dtoDossier.getCodePostal())
                            .buildCodePriorite(dtoDossier.getCodePriorite())
                            .buildCodeStatut(dtoDossier.getCodeStatut())
                            .buildCodeTypeDossier(dtoDossier.getCodeTypeDossier())
                            .buildDateCloture(dtoDossier.getDateCloture())
                            .buildDateCreation(dtoDossier.getDateCreation())
                            .buildDateEnregistrement(dtoDossier.getDateEnregistrement())
                            .buildDescriptionNote(dtoDossier.getDescriptionNote())
                            .buildIdentifiant(dtoDossier.getIdentifiant())
                            .buildIdentifiantCampagne(dtoDossier.getIdentifiantCampagne())
                            .buildIdentifiantContrat(dtoDossier.getIdentifiantContrat())
                            .buildIdentifiantEntiteResponsable(dtoDossier.getIdentifiantEntiteResponsable())
                            .buildIdentifiantIntermediaire(dtoDossier.getIdentifiantIntermediaire())
                            .buildIdentifiantRCE(dtoDossier.getIdentifiantRCE())
                            .buildIdentifiantResponsable(dtoDossier.getIdentifiantResponsable())
                            .buildLibelleCivilite(dtoDossier.getLibelleCivilite())
                            .buildLibelleLocalite(dtoDossier.getLibelleLocalite())
                            .buildLibelleNature(dtoDossier.getLibelleNature())
                            .buildLibelleType(dtoDossier.getLibelleType())
                            .buildNom(dtoDossier.getNom())
                            .buildNomActeurResponsable(dtoDossier.getNomActeurResponsable())
                            .buildNomCampagne(dtoDossier.getNomCampagne())
                            .buildNomEmetteur(dtoDossier.getNomEmetteur())
                            .buildNomEntiteResponsable(dtoDossier.getNomEntiteResponsable())
                            .buildNomRue(dtoDossier.getNomRue())
                            .buildNumeroPortable(dtoDossier.getNumeroPortable())
                            .buildNumeroReference(dtoDossier.getNumeroReference())
                            .buildNumeroRue(dtoDossier.getNumeroRue())
                            .buildNumeroTelephone(dtoDossier.getNumeroTelephone())
                            .buildPrenom(dtoDossier.getPrenom())
                            .buildSousType(dtoDossier.getSousType())
                            .buildPeriodeValidite(buildDateRange(dtoDossier.getPeriodeValidite()))
                            .buildMontantAnnuelHT(buildMonetaryQuantity(dtoDossier.getMontantAnnuelHT()))
                            .buildMontantTotalVersement(buildMonetaryQuantity(dtoDossier.getMontantTotalVersement()))
                            .buildMontantTotalVP(buildMonetaryQuantity(dtoDossier.getMontantTotalVP()))
                            .buildFamilleproduit(buildFamilleProduit(dtoDossier))
                            .buildMotifs(buildMotifs(dtoDossier))
                            .build();
        }

        return dossierDetailDossier;
    }

    /**
     * @param dateRange dateRange
     * @return IDateRangeDetailDossier
     */
    private IDateRangeDetailDossier buildDateRange(DateRange dateRange) {

        DTODateRangeDetailDossierBuilder buildDTODateRangeDetailDossier =
                        DTODateRangeDetailDossierBuilder.dTODateRangeDetailDossier();

        if (dateRange != null) {

            buildDTODateRangeDetailDossier.buildStartDate(dateRange.getStartDate());
            buildDTODateRangeDetailDossier.buildEndDate(dateRange.getEndDate());
        }

        return buildDTODateRangeDetailDossier.build();
    }

    /**
     * @param monetaryQuantity monetaryQuantity
     * @return IMonetaryQuantity
     */
    private IMonetaryQuantity buildMonetaryQuantity(MonetaryQuantity monetaryQuantity) {

        DTOMonetaryQuantityBuilder buildDTOMonetaryQuantity = DTOMonetaryQuantityBuilder.dTOMonetaryQuantity();

        if (monetaryQuantity != null) {
            buildDTOMonetaryQuantity.buildValue(monetaryQuantity.getValue());
            buildDTOMonetaryQuantity.buildUnit(monetaryQuantity.getUnit());

        }

        return buildDTOMonetaryQuantity.build();
    }

    /**
     * @param dtoDossier dossier
     * @return liste IFamilleProduitDetailDossier
     */
    private List<IFamilleProduitDetailDossier> buildFamilleProduit(DtoDossier dtoDossier) {

        List<IFamilleProduitDetailDossier> listeIFamilleProduitDetailDossier = null;

        List<DtoFamilleProduit> listDtoFamilleproduit = dtoDossier.getFamilleproduit();

        if (CollectionUtils.isNotEmpty(listDtoFamilleproduit)) {

            listeIFamilleProduitDetailDossier = new ArrayList<IFamilleProduitDetailDossier>();

            CollectionUtils.collect(listDtoFamilleproduit, getTransformerDtoFamilleProduit2FamilleProduit(),
                            listeIFamilleProduitDetailDossier);
        }

        return listeIFamilleProduitDetailDossier;

    }

    /**
     * @param dtoDossier dossier
     * @return liste IMotifsDetailDossier
     */
    private List<IMotifsDetailDossier> buildMotifs(DtoDossier dtoDossier) {

        List<IMotifsDetailDossier> listeIMotifsDetailDossiers = null;

        List<DtoMotifs> listeDtoMotifs = dtoDossier.getMotifs();

        if (CollectionUtils.isNotEmpty(listeDtoMotifs)) {

            listeIMotifsDetailDossiers = new ArrayList<IMotifsDetailDossier>();

            CollectionUtils.collect(listeDtoMotifs, getTransformerDtoMotifs2IMotifs(), listeIMotifsDetailDossiers);
        }

        return listeIMotifsDetailDossiers;
    }

    /**
     * @return transformer DtoFamilleProduit -> IFamilleProduitDetailDossier
     */
    private Transformer getTransformerDtoFamilleProduit2FamilleProduit() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                DtoFamilleProduit dtoFamilleProduit = DtoFamilleProduit.class.cast(input);

                IFamilleProduitDetailDossier familleProduitDetailDossier =
                                DTOFamilleProduitDetailDossierBuilder.dTOFamilleProduitDetailDossier()
                                                .buildIdentifiant(dtoFamilleProduit.getIdentifiant())
                                                .buildNom(dtoFamilleProduit.getNom())
                                                .build();

                return familleProduitDetailDossier;
            }
        };

        return transformer;
    }

    /**
     * @return transformer dtoMotifs -> IMotifsDetailDossier
     */
    private Transformer getTransformerDtoMotifs2IMotifs() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                DtoMotifs dtoMotifs = DtoMotifs.class.cast(input);

                IMotifsDetailDossier motifsDetailDossier = DTOMotifsDetailDossierBuilder.dTOMotifsDetailDossier()
                                .buildIdentifiant(dtoMotifs.getIdentifiant())
                                .build();

                return motifsDetailDossier;
            }
        };

        return transformer;
    }

}
